package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.BeneficioService;
import co.gov.medellin.ssti.sub.model.service.ModificarBOTService;
import co.gov.medellin.ssti.sub.model.service.VflexService;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoVO;
import co.gov.medellin.ssti.sub.model.vo.ModificarBOTVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;

public class ModificarBOTAction extends Action {
	@Autowired
	AtributosService atributosServiceImpl;
	@Autowired
	BeneficioService beneficioServiceImpl;
	@Autowired
	ModificarBOTService modificarBOTServiceImpl;
	@Autowired
	VflexService vflexServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		SubprogramaVO codigosub = new SubprogramaVO();

		HttpSession session = request.getSession();
		String strCodigoSubpro = (String) request.getAttribute("codbene");
		String strCodigoBeneficiario = (String) request.getAttribute("code");
		String strCodigoBOT = request.getParameter("codeBot");
		codigosub.setCode(new Long(strCodigoSubpro));

		// Proceso para la auditoria
		Calendar c = Calendar.getInstance();

		// Fin del proceso

		BeneficiarioVO beneVO = new BeneficiarioVO();
		List<BeneficiarioVO> coPropBeneficiario = (List<BeneficiarioVO>) session
				.getAttribute("beneSelected");
		List<AtributoVO> lAtributos = new LinkedList<AtributoVO>();

		// Proceso para convertir los atributos que no tienen valores en la
		// lista
		try {
			int conversion = atributosServiceImpl
					.findAtributosValidarLista(new Long(strCodigoSubpro));
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}

		Collection<AtributoVO> atributos = null;

		session.setAttribute("beneficiario", strCodigoBeneficiario);
		try {

			atributos = atributosServiceImpl.findAtributosSubprograma(
					Long.valueOf(strCodigoSubpro), "A", 0);

			int tam = atributos.size();
			String strTamano = String.valueOf(tam);

			session.setAttribute("tamanoLista", strTamano);
			session.setAttribute("ListaAtributos", atributos);

			// Proceso para calcular la edad
			beneVO = (BeneficiarioVO) coPropBeneficiario.get(0);
			String strFechaNacimiento = beneVO.getFechaNacimiento();
			if (strFechaNacimiento != null && !strFechaNacimiento.equals("")) {
				AtributoVO objAtriVO = new AtributoVO();
				lAtributos = (List<AtributoVO>) atributos;
				if (atributos != null && atributos.size() != 0) {
					for (int i = 0; i < lAtributos.size(); i++) {
						objAtriVO = (AtributoVO) lAtributos.get(i);
						if ((objAtriVO.getDescripcion()).equals("EDAD")) {
							Calendar calendario = Calendar.getInstance();
							String strFechaActual = (calendario
									.get(Calendar.DAY_OF_MONTH) < 10 ? "0" : "")
									+ calendario.get(Calendar.DAY_OF_MONTH)
									+ "/"
									+ ((calendario.get(Calendar.MONTH) + 1) < 10 ? "0"
											: "")
									+ (calendario.get(Calendar.MONTH) + 1)
									+ "/" + calendario.get(Calendar.YEAR);

							String ArrFechaActual[] = strFechaActual.split("/");
							String strDayAc = ArrFechaActual[0];
							String strMonthAc = ArrFechaActual[1];
							String strYearAc = ArrFechaActual[2];

							String ArrFechaNacimiento[] = ((String) beneVO
									.getFechaNacimiento()).split("/");
							String strDayNa = ArrFechaNacimiento[0];
							String strMonthNa = ArrFechaNacimiento[1];
							String strYearNa = ArrFechaNacimiento[2];

							// resto los a�os de las dos fechas
							int iEdad = Integer.parseInt(strYearAc)
									- Integer.parseInt(strYearNa) - 1; // -1
																		// porque
																		// no se
																		// si ha
																		// cumplido
																		// a�os
																		// ya
																		// este
																		// a�o

							// si resto los meses y me da menor que 0 entonces
							// no ha cumplido a�os. Si da mayor si ha cumplido
							if (((Integer.parseInt(strMonthAc)) - (Integer
									.parseInt(strMonthNa))) > 0)
								iEdad += 1;

							if (((Integer.parseInt(strMonthAc)) - (Integer
									.parseInt(strMonthNa))) == 0) {
								// si resto los dias y me da menor que 0
								// entonces no ha cumplido a�os. Si da mayor o
								// igual si ha cumplido
								if (((Integer.parseInt(strDayAc)) - (Integer
										.parseInt(strDayNa))) >= 0)
									iEdad += 1;
							}

							request.setAttribute("Edad", String.valueOf(iEdad));
							session.setAttribute("DateBirth",
									(String) beneVO.getFechaNacimiento());
						}
					}

				}
			}
			// Fin del proceso

			// proceso que traer el resto de la informacion

			List<AtributoVO> latributos = (List<AtributoVO>) modificarBOTServiceImpl
					.findAtributosSubpro(strCodigoSubpro);
			List<ModificarBOTVO> lResultados = new LinkedList<ModificarBOTVO>();
			// String strSede =
			// objModificarBOT.GetSedeOtorgamiento(strCodigoBOT);
			// session.setAttribute("codesede", strSede);
			String strSede = (String) session.getAttribute("codesede");
			for (int i = 0; i < latributos.size(); i++) {
				AtributoVO atrivo = new AtributoVO();
				atrivo = (AtributoVO) latributos.get(i);
				if (atrivo.getTipoatributo().equals("R")) {
					String strValor = modificarBOTServiceImpl
							.findBeneficiarioAtri(atrivo.getTipodato(),
									strCodigoBeneficiario,
									atrivo.getCodatributo());
					ModificarBOTVO modifBOTVO = new ModificarBOTVO();
					if (strValor != null && !strValor.equals("")) {
						modifBOTVO.setNombre(atrivo.getNombre());
						modifBOTVO.setValorInicial(strValor);
						modifBOTVO.setTipoatributo(atrivo.getTipoatributo());
						lResultados.add(modifBOTVO);
						modifBOTVO = null;
					} else {
						modifBOTVO.setNombre(atrivo.getNombre());
						modifBOTVO.setValorInicial("");
						modifBOTVO.setTipoatributo(atrivo.getTipoatributo());
						lResultados.add(modifBOTVO);
						modifBOTVO = null;
					}
				} else {
					if (!strSede.equals("")) {
						// consulta valor y codigo de atributos del beneficio
						ModificarBOTVO modificarBOTVO = modificarBOTServiceImpl
								.findBeneficioAtri(atrivo.getTipodato(),
										strCodigoBOT, atrivo.getCodatributo());

						modificarBOTVO.setNombre(atrivo.getNombre());
						modificarBOTVO
								.setTipoatributo(atrivo.getTipoatributo());
						if (modificarBOTVO.getValorInicial() == null) {
							modificarBOTVO.setValorInicial("");
						}
						lResultados.add(modificarBOTVO);

					}
				}
			}
			session.setAttribute("listaresultados", lResultados);

			// fin del proceso

			// Proceso para obtener el valor del beneficio
			String strCostBene = null;
			strCostBene = beneficioServiceImpl.findCostoBOT(new Long(
					strCodigoBOT));
			if (strCostBene != null) {
				request.setAttribute("CostBene", strCostBene);
			}

			// hechos victimizantes
			Collection<VflexVO> hechosVictimizantes = vflexServiceImpl
					.findVflex(VflexService.HECHO_VICTIMIZANTE);
			request.setAttribute("hechosVictimizantes", hechosVictimizantes);

			BeneficioOtorgadoVO bot = beneficioServiceImpl.findBOT(Long
					.valueOf(strCodigoBOT));
			String tercero = null;
			String strTypeBot = null;
			String strDate = null;
			String codigoHechoVictimizante = null;

			if (bot != null) {
				tercero = bot.getTercero();
				strTypeBot = bot.getTipoBeneficio() != null ? bot
						.getTipoBeneficio() : "";
				strDate = bot.getFechaBeneficio();
				codigoHechoVictimizante = bot.getHechoVictimizante() != null ? bot
						.getHechoVictimizante().toString() : "";
			}

			if (strTypeBot != null) {
				request.setAttribute("TipoBene", strTypeBot);
			}

			SimpleDateFormat dateFormat2 = new SimpleDateFormat("dd/MM/yyyy");
			if (strDate == null) {
				strDate = dateFormat2.format(c.getTime());
			}
			request.setAttribute("DateBene", strDate);

			if (tercero != null) {
				request.setAttribute("Tercero", tercero);
			}

			if (codigoHechoVictimizante != null) {
				request.setAttribute("codigoHechoVictimizante",
						codigoHechoVictimizante);
			}

		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}

		return mapping.findForward("success");
	}
}
